<template>
  <div class="person">
    <h1>情况二:监视【ref】定义的【对象类型】数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改整个人</button>
  </div>
</template>

<script lang="ts" setup name="Person">
  import { ref, watch } from "vue";

  //数据
  let person = ref({
    name: "张三",
    age: 18,
  });

  //方法
  function changeName() {
    person.value.name += "~";
  }
  function changeAge() {
    person.value.age += 1;
  }
  function changePerson() {
    //ref定义的对象现在修改了person,是新对象替换了旧对象，对象地址已经发生了改变,  而reactive只是将对象的属性的值改了，就是说对象还是那个对象
    person.value = { name: "李四", age: 7 };
  }

  /*
    监视,  情况一:监视【ref】定义的【对象类型】数据  监视的是对象的地址值，若想监视对象内部属性的变化,需要手动开启深度监视
    watch的第一个参数是:被监视的数据
    watch的第二个参数是:监视的回调函数
    watch的第三个参数是:配置对象(deep,immediate 等等...)
  */
  watch(
    person,
    (newValue, oldValue) => {
      console.log("person变化了", newValue, oldValue);
    },
    { deep: true, immediate: true } // deep: true, 写了他就是开启深度监视，就是说你只修改对象的一个属性的值的时候也会被监视
    // { deep: true, immediate: true }  immediate: true写了他一打开页面就会执行该箭头函数，叫立即执行函数
  );
</script>

<style scoped>
  .person {
    background-color: aqua;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
  }

  button {
    margin-left: 5px;
    margin-right: 5px;
  }
</style>
